
import trigger  from "../../effect/trigger.js";
import { TriggerOpTypes, hasChanged } from "../../util.js"

export default function(target, key, value) {
    // 关于具体的操作类型需要进一步判断
    // 有可能是set，也有可能是add
    const type = target.hasOwnProperty(key) ? TriggerOpTypes.SET : TriggerOpTypes.ADD;

    // 先缓存下旧值
    const oldValue = target[key];
    // 先缓存下旧的数组长度
    const oldLen = Array.isArray(target) ? target.length : undefined;


    // 设置新值
    const result = Reflect.set(target, key, value);
    // 如果值发生了变化，则触发依赖
    if(hasChanged(value, oldValue)) {
        trigger(target, type, key)

        // 如果数组的length发生了变化，需要派发更新
        if(Array.isArray(target) && oldLen !== target.length) {
            // 之所以在这里要判断，是因为length显示的改变本来就会派发更新
            if(key !== 'length') {
                // 进入此if说明length发生了隐式的变化
                trigger(target, TriggerOpTypes.SET, 'length')
            } else {
                // 进入此分支说明length发生了显示的变化
                // 需要处理长度小于旧长度的情况，因为发生了删除
                if(oldLen > target.length) {
                    for(let i = target.length; i < oldLen; i++) {
                        trigger(target, TriggerOpTypes.DELETE, i.toString());
                    }
                }
            }
        }
    }
    return result;
}